name: Build Commits

# Any change in triggers needs to be reflected in the concurrency group.
on: [pull_request]

permissions: read-all

concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.number }}
  cancel-in-progress: true

jobs:
  build_commits:
    name: Check if build works for every commit
    runs-on: ubuntu-22.04
    timeout-minutes: 90
    steps:
      - name: Configure git
        run: |
          git config --global user.name "GitHub Actions"
          git config --global user.email "github-actions@users.noreply.github.com"

      - name: Install Go
        uses: actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491 # v5.0.0
        with:
          # renovate: datasource=golang-version depName=go
          go-version: 1.22.0

      - name: Set clang directory
        id: set_clang_dir
        run: echo "clang_dir=$HOME/.clang" >> $GITHUB_OUTPUT

      - name: Cache LLVM and Clang
        id: cache-llvm
        uses: actions/cache@13aacd865c20de90d75de3b17ebe84f7a17d57d2 # v4.0.0
        with:
          path: ${{ steps.set_clang_dir.outputs.clang_dir }}
          key: llvm-10.0

      - name: Install LLVM and Clang prerequisites
        run: |
          sudo apt-get update
          sudo apt-get install -y --no-install-recommends libtinfo5

      - name: Install LLVM and Clang
        uses: KyleMayes/install-llvm-action@be40c5af3a4adc3e4a03199995ab73aa37536712 # v1.9.0
        with:
          version: "10.0"
          directory: ${{ steps.set_clang_dir.outputs.clang_dir }}
          cached: ${{ steps.cache-llvm.outputs.cache-hit }}

      - name: Install ginkgo
        run: |
          go install github.com/onsi/ginkgo/ginkgo@cc0216944b25a88d3259699a029d4e601fb8a222 # v1.12.1

      - name: Checkout code
        uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
        with:
          persist-credentials: false
          ref: ${{ github.event.pull_request.head.sha }}
          fetch-depth: 0

      - name: Check if build works for every commit
        run: |
          PR_COMMITS_API_JSON=$(curl \
            -H "Accept: application/vnd.github.v3+json" \
            -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
            ${{ github.event.pull_request.commits_url }})
          PR_FIRST_SHA=$(echo "$PR_COMMITS_API_JSON" | jq -r ".[0].sha")
          PR_PARENT_SHA=$(git rev-parse "${PR_FIRST_SHA}^")
          git rebase --exec "make build -j $(nproc)" $PR_PARENT_SHA

      - name: Check bpf code changes
        uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1
        id: bpf-tree
        with:
          filters: |
            src:
              - 'bpf/**'

      # Runs only if code under bpf/ is changed.
      - name: Check if datapath build works for every commit
        if: steps.bpf-tree.outputs.src == 'true'
        run: |
          PR_COMMITS_API_JSON=$(curl \
            -H "Accept: application/vnd.github.v3+json" \
            -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
            ${{ github.event.pull_request.commits_url }})
          PR_FIRST_SHA=$(echo "$PR_COMMITS_API_JSON" | jq -r ".[0].sha")
          PR_PARENT_SHA=$(git rev-parse "${PR_FIRST_SHA}^")
          git rebase --exec "make -C bpf build_all -j $(nproc)" $PR_PARENT_SHA

      - name: Check test code changes
        uses: dorny/paths-filter@ebc4d7e9ebcb0b1eb21480bb8f43113e996ac77a # v3.0.1
        id: test-tree
        with:
          filters: |
            src:
              - 'pkg/**'
              - 'test/**'

      # Runs only if code under test/ is changed.
      - name: Check if ginkgo test suite build works for every commit
        if: steps.test-tree.outputs.src == 'true'
        run: |
         PR_COMMITS_API_JSON=$(curl \
            -H "Accept: application/vnd.github.v3+json" \
            -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \
            ${{ github.event.pull_request.commits_url }})
          PR_FIRST_SHA=$(echo "$PR_COMMITS_API_JSON" | jq -r ".[0].sha")
          PR_PARENT_SHA=$(git rev-parse "${PR_FIRST_SHA}^")
          git rebase --exec "make -C test build -j $(nproc) && make -C test build-darwin" $PR_PARENT_SHA

      - name: Failed commit during the build
        if: ${{ failure() }}
        run: git --no-pager log --format=%B -n 1
